#!/usr/bin/python3

# TO DO
# Добавить сохранение данных в cvs
# Парсить цены модель бренд
# и дать возможность скачать

import sys
import telebot
from time import sleep
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton, Message
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.firefox import GeckoDriverManager
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.common.exceptions import NoSuchElementException
from fake_useragent import UserAgent

API_TOKEN = "ВАШ ТОКЕН"
SITE_URL = "https://shopme.online/"

# Настройка парсера
userAgent = UserAgent()

# Options parser
parserOptions = Options()
parserOptions.set_preference("general.useragent.override", userAgent.firefox)
#parserOptions.binary = "./geckodriver"
#parserOptions.headless = True

# Service parser
parserService = Service(GeckoDriverManager().install())
parser = webdriver.Firefox(
    service = parserService,
    options = parserOptions
)


# Телеграм бот
bot = telebot.TeleBot(API_TOKEN, parse_mode=None)
textMessages = {
    'welcome':
        u'Привет {userName}!\n'
        u'Меня зовут MyVeryCoolbot. \n\n'
        u'Я бот, который парсит сайт www.shopme.online. \n'
        u'Вы можете получить список товаров из нужной вам категорий. \n\n'
        u'/help - получить список комманд',

    'listCommands':
        u'Список доступных комманд: \n\n'
        u'/getGoods - спарсить товары \n',
}

# Markups
def gen_markup_select_category():
    markup = InlineKeyboardMarkup()
    markup.row_width = 2
    markup.add(InlineKeyboardButton("Fashion", callback_data="Fashion"),
               InlineKeyboardButton("Accessories", callback_data="Accessories"),
               InlineKeyboardButton("BeautyPerfumes", callback_data="BeautyPerfumes"),
               InlineKeyboardButton("Watches", callback_data="Watches"))
    return markup

# Events
@bot.message_handler(commands=['start', 'getGoods'])
def send_welcome(message: Message):
    userName = message.from_user.username
    bot.reply_to(message, textMessages['welcome'].format(userName=userName))
    bot.send_message(
        message.chat.id,
        "Выбирите категорию товара",
        reply_markup=gen_markup_select_category()
    )


@bot.message_handler(commands=['help'])
def send_list_commands(message):
    bot.send_message(message.chat.id, textMessages['listCommands'])

# Парсит продукты по выбраной категории
@bot.callback_query_handler(func=lambda call: True)
def getGoods(call):
    bot.send_message(call.message.chat.id, "Пожалуйста подождите...")

    if call.data == "Fashion":
        currentUrl = f"{SITE_URL}Fashion"
    elif call.data == "Accessories":
        currentUrl = f"{SITE_URL}index.php?route=product/category&path=68"
    elif call.data == "BeautyPerfumes":
        currentUrl = f"{SITE_URL}Beauty-Perfumes"
    elif call.data == "Watches":
        currentUrl = f"{SITE_URL}index.php?route=product/category&path=61"
    elif call.data == "Electronics":
        currentUrl = f"{SITE_URL}index.php?route=product/category&path=62"
    elif call.data == "Shoes":
        currentUrl = f"{SITE_URL}Shoes"


    # Заходим на сайт
    parser.get(url=currentUrl)
    parser.implicitly_wait(10)

    # Закрываем попап
    parser.find_element(By.XPATH, "/html/body/div[4]/div[1]/button").click()
    parser.implicitly_wait(10)

    # Получаем wrapper products
    products = parser.find_element(By.CLASS_NAME, "main-products").find_elements(By.CLASS_NAME, "product-thumb")
    parser.implicitly_wait(10)

    # Выполняем JS code что бы сделать элементы с описанием видимыми (productDescription будет None)
    parser.execute_script(
"""
let descriptions = document.querySelectorAll('.description');
for (let d of descriptions) {
  d.setAttribute('style', 'display: block;');
}
""")

    # Парсим параметры каждого товара
    for index in range(len(products)):
        productName = products[index].find_element(By.CLASS_NAME, "name").text
        productUrl = products[index].find_element(By.CSS_SELECTOR, ".name > a").get_attribute('href')
        productUrlImage = products[index].find_element(By.CLASS_NAME, "img-responsive").get_attribute('src')
        productDescription = products[index].find_element(By.CLASS_NAME, "description").text
 

        bot.send_message(
            call.message.chat.id,
            f"""
Имя: {productName} 
Описание: {productDescription} \n
Ссылка на товар: {productUrl} 
Ссылка на картинку: {productUrlImage} \n
""")





def main_loop():
    bot.infinity_polling()
    while 1:
        sleep(3)

if __name__ == '__main__':
    try:
        main_loop()
    except KeyboardInterrupt:
        print('\nExiting by user request.\n')
        parser.close()
        parser.quit()
        sys.exit(0)



